package org.yzhzc.friend.service.user.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.yzhzc.common.core.constants.Constants;
import org.yzhzc.common.core.domain.PageQueryDTO;
import org.yzhzc.common.core.domain.TableDataInfo;
import org.yzhzc.common.core.utils.ThreadLocalUtil;
import org.yzhzc.friend.domain.message.vo.MessageTextVO;
import org.yzhzc.friend.manager.MessageCacheManager;
import org.yzhzc.friend.mapper.message.MessageTextMapper;
import org.yzhzc.friend.service.user.IUserMessageService;

import java.util.List;

/**
 * 用户消息服务实现类。
 * 提供用户消息列表查询功能。
 */
@Slf4j
@Service
public class UserMessageServiceImpl implements IUserMessageService {

    @Autowired // 自动注入消息缓存管理器
    private MessageCacheManager messageCacheManager;

    @Autowired // 自动注入消息文本数据访问接口
    private MessageTextMapper messageTextMapper;

    /**
     * 查询用户消息列表。
     *
     * @param dto 分页查询条件
     * @return 分页的消息列表数据
     */
    @Override
    public TableDataInfo list(PageQueryDTO dto) {
        Long userId = ThreadLocalUtil.get(Constants.USER_ID, Long.class); // 获取当前用户 ID
        Long total = messageCacheManager.getListSize(userId); // 从缓存中获取消息总数
        List<MessageTextVO> messageTextVOList;

        // 如果缓存中没有数据，则从数据库中查询
        if (total == null || total <= 0) {
            // 使用分页插件进行分页查询
            PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
            messageTextVOList = messageTextMapper.selectUserMsgList(userId); // 查询用户消息列表
            messageCacheManager.refreshCache(userId); // 刷新缓存
            total = new PageInfo<>(messageTextVOList).getTotal(); // 获取总数
        } else {
            // 从缓存中获取消息列表
            messageTextVOList = messageCacheManager.getMsgTextVOList(dto, userId);
        }

        // 如果消息列表为空，则返回空数据
        if (CollectionUtil.isEmpty(messageTextVOList)) {
            return TableDataInfo.empty();
        }

        // 返回分页的消息列表数据
        return TableDataInfo.success(messageTextVOList, total);
    }
}